package com.monolithiot.sso.common.util;

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

/**
 * 2018/11/15 Create by 郭文梁
 * DateUtil
 * 时间日期工具类
 *
 * @author 郭文梁
 * @date 2018/11/15
 */
public class DateUtil {
    /**
     * 获取现在时间
     *
     * @return Date
     */
    public static Date now() {
        return new Date();
    }

    /**
     * 获取昨天日期
     *
     * @param date 当前日期
     * @return 昨天日期
     */
    public static Date yesterday(Date date) {
        Calendar calendar = getCalendar(date);
        calendar.add(Calendar.DAY_OF_YEAR, -1);
        return calendar.getTime();
    }

    /**
     * 本月第一天
     *
     * @param date 时间
     * @return 本月第一天日期
     */
    public static Date firstDayOfMonth(Date date) {
        Calendar calendar = getCalendar(date);
        clearTime(calendar);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        return calendar.getTime();
    }

    /**
     * 本月最后一天
     *
     * @param date 日期
     * @return 最后一天
     */
    public static Date lastDayOfMonth(Date date) {
        Calendar calendar = getCalendar(date);
        clearTime(calendar);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        return calendar.getTime();
    }

    /**
     * 清空时间
     *
     * @param calendar 日历
     */
    private static void clearTime(Calendar calendar) {
        calendar.set(Calendar.HOUR, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
    }

    /**
     * 获取日期为当月第几天
     *
     * @param date 日期
     * @return 天数
     */
    public static int getDayOfMonth(Date date) {
        Calendar calendar = getCalendar(date);
        return calendar.get(Calendar.DAY_OF_MONTH);
    }

    /**
     * 获取当月有多少天
     *
     * @param date 日期
     * @return 天数
     */
    public static int maxDayOfMonth(Date date) {
        Calendar calendar = getCalendar(date);
        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    }

    /**
     * 获取日历工具
     *
     * @param date 日期
     * @return 日历
     */
    private static Calendar getCalendar(Date date) {
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai"));
        calendar.setTime(date);
        return calendar;
    }
}
